-- ------------------------------------------
-- AbrirCuenta
-- Un nuevo cliente se registra.
-- ------------------------------------------

CREATE OR REPLACE FUNCTION AbrirCuenta(param_username usuarios.username%TYPE,
                            param_password usuarios.password%TYPE,
                            param_nombre   usuarios.nombre%TYPE,
                            param_tipo     usuarios.tipoUsuario%TYPE)
RETURNS usuarios.idUsuario%TYPE AS $$

        DECLARE
                id usuarios.idUsuario%TYPE;
                n  int;

	BEGIN
                -- Ver si hay otros user con mismo username
                SELECT INTO n count(*) FROM usuarios WHERE username = param_username;

		-- Excepciones
                IF (n != 0) THEN
                    RAISE EXCEPTION 'Ya existe un usuario con ese username.';
                END IF;

                IF (param_username = '' OR param_password = '' OR param_nombre = '') THEN
                    RAISE EXCEPTION 'Existen campos vacios.';
                END IF;

                IF (param_tipo != 1 AND param_tipo != 2) THEN
                    RAISE EXCEPTION 'Debe ser tipo 2(normal) o 1(admin)';
                END IF;

                -- Realizar insercion
                INSERT INTO usuarios (username      , activo, password      , nombre      , tipoUsuario, saldo)
                             VALUES (param_username, true  , param_password, param_nombre, param_tipo , 0    );

                -- Retornar nuevo id.
                SELECT INTO id idUsuario FROM usuarios WHERE username = param_username;

                RETURN id;
	END;

$$ LANGUAGE plpgsql